Many different types of computing systems have attained widespread use around the world. These computing systems include personal computers, servers, mainframes and a wide variety of stand-alone and embedded computing devices. Sprawling client-server systems exist, with applications and information spread across many PC networks, mainframes and minicomputers. In a distributed system connected by networks, a user may access many application programs, databases, network systems, operating systems and mainframe applications. Computers provide individuals and businesses with a host of software applications including word processing, spreadsheet, accounting, e-mail, voice over Internet protocol telecommunications, and facsimile.
Users of digital processors such as computers continue to demand greater and greater performance from such systems for handling increasingly complex and difficult tasks. In addition, processing speed has increased much more quickly than that of main memory accesses. As a result, cache memories, or caches, are often used in many such systems to increase performance in a relatively cost-effective manner. Many modern computers also support “multi-tasking” or “multi-threading” in which two or more programs, or threads of programs, are run in alternation in the execution pipeline of the digital processor. A common architecture for high performance, single-chip microprocessors is the reduced instruction set computer (RISC) architecture characterized by a small simplified set of frequently used instructions for rapid execution. Thus, in a RISC architecture, a complex instruction comprises a small set of simple instructions that are executed in steps very rapidly. These steps are performed in execution units adapted to execute specific simple instructions. In a superscalar architecture, these execution units typically comprise load/store units, integer Arithmetic/Logic Units, floating point Arithmetic/Logic Units, and Graphical Logic Units that operate in parallel. In a processor architecture, an operating system controls operation of the processor and components peripheral to the processor. Executable application programs are stored in a computer's hard drive. The computer's processor causes application programs to run in response to user inputs.
Memory storage is a critical component of almost every software application in existence today. As the storage industry has matured, the number of storage options and the performance of data entry and retrieval have significantly increased. Storage options include magnetic tape, hard disk drives (HDD), Compact Disk (CD), Digital Video Disk (DVD), and other media. Within the category of hard disk drives, a wealth of storage options exist, ranging from simple and less reliable standalone HDDs to high performance, redundant disk arrays. This complicates virtual storage environments. Primary metrics of disk arrays include access speed, and redundancy. Complicated virtual storage environments include storage architectures that extend beyond a single computing environment. Such environments include Storage Area Networks (SAN). Each storage mechanism has an associated cost and service level, both of which may widely vary.
In practice, many application programs experience peak periods of use, and consequently, more stringent service level requirements. These programs experience periods of relatively low use during off-peak periods, with consequent lower service level requirements during off-peak periods. An application program developer must decide what storage mechanisms will be required by an application program based on anticipated use, costs, service level requirements, as well as other factors. For example, a backup/recovery system may call for a high service level storage subsystem to store files that are used frequently, or are of high importance, the loss of which may be critically detrimental. Often, the anticipated needs vary from the actual needs that develop when the program is installed. Additionally, storage needs may change overtime.
Currently, when anticipated needs of an application program are different from actual needs, an application program administrator requests a change in storage service from a storage administrator. Such changes are disruptive and require down-time to physically move files from one storage subsystem to another, to reclaim underutilized storage, and to provide additional storage. Changing needs may also call for a change in storage layout. Altering the layout typically involves migration of files temporarily to facilitate an alternate storage layout to meet changing demands. What is therefore needed is a way of automatically migrating files from one memory subsystem to another with little or no disruption of application program use.